Note: This tutorial assumes that you have completed the previous tutorials: Arduino IDE Setup. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
ハローワールド (おためしパブリッシャ)
Description: このチュートリアルではrosserialを使ってパブリッシャを作る方法を説明します。Tutorial Level:
Next Tutorial: Blink (example subscriber)
Contents
ハローワールド: パブリッシャをつくる
ソースコード
rosserialの理解を深める手始めとして「ハローワールド」プログラム作成から始めるとしましょう。(注意:Arduinoのコミュニティではプログラムのソースコードを「スケッチ」と呼びます。以下もその慣習にしたがっています。) チュートリアルArduino IDE Setupを終了したならば、Arduinoのexamplesメニューからros_lib -> HelloWorldを選択することで以下のスケッチを開くことが出来ます。
IDEには次のコードが表示されるでしょう。:
1 /*
2 * rosserial Publisher Example
3 * Prints "hello world!"
4 */
5
6 #include <ros.h>
7 #include <std_msgs/String.h>
8
9 ros::NodeHandle nh;
10
11 std_msgs::String str_msg;
12 ros::Publisher chatter("chatter", &str_msg);
13
14 char hello[13] = "hello world!";
15
16 void setup()
17 {
18 nh.initNode();
19 nh.advertise(chatter);
20 }
21
22 void loop()
23 {
24 str_msg.data = hello;
25 chatter.publish( &str_msg );
26 nh.spinOnce();
27 delay(1000);
28 }
コードの説明
それではコードを分解して見ていきましょう。
ROSでは全てのArduinoプログラムにros.hと使用される全てのメッセージのヘッダファイルをインクルードする必要があります。
9 ros::NodeHandle nh;
次に、プログラム上でパブリッシャとサブスクライバを作るノードハンドルのインスタンスを作成しておく必要があります。ノードハンドルはシリアルポート通信も扱います。
プログラムで使うパブリッシャとサブスクライバをインスタンス化します。ここでは"chatter"というトピック名のパブリッシャのインスタンスを作ります。パブリッシャの2番目のパラメータはパブリッシュされるメッセージインスタンスへの参照です。
次に、Arduinoのsetup関数の中でROSノードハンドルを初期化し、パブリッシュされる全トピックのアドバタイズとリスンしたい全トピックのサブスクライブをする必要があります。
最後にloop関数の中で、ノードは"Hello World"をパブリッシュし、ROS通信の全コールバック関数を扱うros::spinOnce()を呼びます。
コードをアップロードする
コードをArduinoへアップロードするにはArduino IDEの内蔵機能を使います。どんなスケッチをアップロードするときもこの手順です。
コードを実行する
では新しいTerminalウインドウでroscoreを立ち上げましょう。:
roscore
次にArduinoもメッセージを他のROSへ伝えるrosserialクライアントアプリケーションを実行します。正しいシリアルポートを使用していることを確認して下さい。:
rosrun rosserial_python serial_node.py /dev/ttyUSB0
最後に、新しいTerminalウインドウを開き、以下のコマンドを実行することでArduinoからの挨拶を見ることができます。:
rostopic echo chatter
さらに
パブリッシャやサブスクライバについての詳細情報はrosserial/Overviewを参照して下さい。またより複雑なデータ型についての情報はlimitationsを参照して下さい。